home *** CD-ROM | disk | FTP | other *** search
AMOS Source Code | 2001-09-10 | 11.0 KB | 441 lines |
- ' *************************************
- ' * *
- ' * Land Of Magic V0.12 *
- ' *Story and Design by Marco Eberhardt*
- ' * Written by Chris Hodges *
- ' * Graphics by Riccard Linde *
- ' *Additional Gfx by Fredrik Johansson*
- ' * Music by Fredrik Johansson *
- ' * *
- ' *************************************
- '
- ' The very slow routines like the anim checking and the
- ' anim invoking have now been placed into an extension
- ' which has to be entered at slot 24.
- ' Not yet maximum speed...
- '
- ' Try clicking on walls! ;-)
- '
- ' Select flip page (1) or smooth scrolling (0)!
- FLIP=0
- ' Try TEST=2
- TEST=2
- '
- LOAFIL["Music/mod.wednesday",-3]
- LOAFIL["Graphics/AllGfx.ptl",10]
- Extension_8_0A24 10
- LOAFIL["Graphics/AllGfx.pal",9]
- For A=0 To 31
- Extension_8_14C6 0,A,Deek(Start(9)+A*2)
- Next
- 'RIPGFX
- LOAFIL["Maps/Attributes.dat",11]
- LOAFIL["Maps/Animations.tan",12]
- Reserve As Work 20,10*1024
- ANBUF=Start(20) : Doke ANBUF,-1
- ARST=Start(11) : ANST=Start(12)
- MAPN=1 : Gosub LOAMAP
- Gosub INITSCREENS
- Gosub INITMAP
- If Length(3) Then Extension_8_10F2 0 : Extension_8_108E 3
- Fade 2 To 7
- MANA=0
- Do
- Screen Swap : Wait Vbl
- Bob Clear
- Add ANIRATE,1,0 To 4
- Gosub CHECKFORTILEANIM
- Gosub MOVEMAN
- Bob 1,MX,MY,MAND*5+MANA/2+2
- Bob Draw
- 'Gosub OLDCHECKFORANIM
- If Mouse Key
- NX=X Screen(X Mouse)/16+PAGX*MSX : NY=Y Screen(Y Mouse)/16+PAGY*MSY : Gosub INVTILE
- While Mouse Key : Multi Wait : Wend
- End If
- MX=MANX-PAGX*MSX*16 : MY=MANY-PAGY*MSY*16
- If FLIP=0
- If MX<0 : Gosub GRIGHT : End If
- If MX=>MSX*16 : Gosub GLEFT : End If
- If MY<0 : Gosub GUP : End If
- If MY=>MSY*16 : Gosub GDOWN : End If
- Else
- If MX<0 or MX=>MSX*16 or MY<0 or MY=>MSY*16
- Gosub GQUICK
- End If
- End If
- Gosub CALCSCROLLMOVEMENT
- Screen Offset 0,SOX,SOY
- Loop
- End
- CHECKFORACTION:
- If ANIRATE=4 Then Return
- ' Extension Y MAPST,MMX,MMY
- Return
- OX=PAGX*MSX : OY=PAGY*MSY
- For Y=OY To OY+MSY-1
- MAD=MAPST+Y*MMX*4
- For X=OX To OX+MSX-1
- AR=Deek(MAD+X*4+2)
- If AR and $8000 Then Plot(X-OX)*16,(Y-OY)*16,1
- Next
- Next
- Return
- OLDCHECKFORANIM:
- OX=PAGX*MSX : OY=PAGY*MSY
- For Y=OY To OY+MSY-1
- MAD=MAPST+Y*MMX*4
- For X=OX To OX+MSX-1
- AR=Deek(MAD+X*4+2)
- INVO=(AR/16) and 7
- If INVO>0 and(AR and $8000)
- Gosub INVOKE : Doke MAD+X*4+2,AR and $7F8F
- End If
- Next
- Next
- Return
- INVOKE:
- ' NX=X : NY=Y : Gosub INVTILE
- If INVO=1 or INVO=5 or INVO=7 Then NX=X : NY=Y-1 : Gosub INVTILE
- If INVO=2 or INVO=5 or INVO=7 Then NX=X+1 : NY=Y : Gosub INVTILE
- If INVO=3 or INVO=5 or INVO=7 Then NX=X : NY=Y+1 : Gosub INVTILE
- If INVO=4 or INVO=5 or INVO=7 Then NX=X-1 : NY=Y : Gosub INVTILE
- If INVO=6 or INVO=7
- NX=X-1 : NY=Y-1 : Gosub INVTILE
- NX=X+1 : NY=Y-1 : Gosub INVTILE
- NX=X-1 : NY=Y+1 : Gosub INVTILE
- NX=X+1 : NY=Y+1 : Gosub INVTILE
- End If
- Return
- INVTILE:
- If NX<0 or NX=>MMX or NY<0 or NY=>MMY Then Return
- AD=MAPST+(NY*MMX+NX)*4
- Doke AD+2,Deek(AD+2) or $8000
- Return
- CHECKFORTILEANIM:
- OX=PAGX*MSX : OY=PAGY*MSY
- 'Extension Y OX,OY To MSX-1,MSY-1,ANBUF,Start(10)
- If ANIRATE<>4 Then Doke ANBUF,-1 : Return
- AD=ANBUF
- NX=MANX/16 : NY=MANY/16
- MAD=MAPST+(NY*MMX+NX)*4
- If Deek(MAD+2) and 8
- P=Deek(ANST+Deek(MAD)*4+2)
- If P
- Doke MAD,P : Doke MAD+2,Deek(ARST+P*4) or $8000
- Doke AD,NX-OX : Doke AD+2,NY-OY : Doke AD+4,P : Add AD,6
- Else
- Doke MAD+2,Deek(ARST+Deek(MAD)*4)
- End If
- End If
- 'Extension Y MAPST,MMX,MMY,ANST,ARST,AD
- 'Extension Y OX,OY To MSX-1,MSY-1,ANBUF,Start(10)
- 'Return
- AD=ANBUF
- While Extension_8_0BE4(AD)>-1
- X=Deek(AD)-OX : Y=Deek(AD+2)-OY : P=Deek(AD+4) : Add AD,6
- If X=>0 and Y=>0 and X<MSX and Y<MSY Then Extension_8_0A36 X,Y,P
- Wend
- NX=MANX/16 : NY=MANY/16
- MAD=MAPST+(NY*MMX+NX)*4
- If Deek(MAD+2) and 8
- P=Deek(ANST+Deek(MAD)*4+2)
- If P
- Doke MAD,P : Doke MAD+2,Deek(ARST+P*4) or $8000
- Doke AD,NX-OX : Doke AD+2,NY-OY : Doke AD+4,P : Add AD,6
- Extension_8_0A36 NX-OX,NY-OY,P
- Else
- Doke MAD+2,Deek(ARST+Deek(MAD)*4)
- End If
- End If
- For Y=0 To MSY-1
- MAD=MAPST+((OY+Y)*MMX+OX)*4
- For X=0 To MSX-1
- T=Deek(MAD+X*4)*4
- P=Deek(ANST+T)
- AR=Deek(MAD+X*4+2)
- If AR and $8000
- If Deek(ANST+T+2)
- P=Deek(ANST+T+2)
- End If
- ' If(X<>NX-OX) or(Y<>NY-OY)
- ' Doke MAD+X*4+2,P and $7FFF
- ' End If
- End If
- If P
- Doke MAD+X*4,P
- AR=Deek(ARST+P*4)
- If AR and 8
- Doke MAD+X*4+2,AR or $8000
- Else
- Doke MAD+X*4+2,AR
- End If
- Doke AD,X : Doke AD+2,Y : Doke AD+4,P : Add AD,6
- Extension_8_0A36 X,Y,P
- End If
- Next
- Next
- Doke AD,-1
- Return
- MOVEMAN:
- DIX=Jleft(1)-Jright(1)
- NX=(MANX+DIX*6)/16 : NY=(MANY-4)/16 : Gosub ACQUAR
- If AR and 3 Then DIX=0
- NX=(MANX+DIX*6)/16 : NY=(MANY+5)/16 : Gosub ACQUAR
- If AR and 3 Then DIX=0
- If DIX=0 Then DIY=Jup(1)-Jdown(1) Else DIY=0
- NX=(MANX-4)/16 : NY=(MANY+DIY*6)/16 : Gosub ACQUAR
- If AR and 3 Then DIY=0
- NX=(MANX+5)/16 : NY=(MANY+DIY*6)/16 : Gosub ACQUAR
- If AR and 3 Then DIY=0
- MANX=Min(Max(MANX+DIX*2,0),MMX*16-1)
- MANY=Min(Max(MANY+DIY*2,0),MMY*16-1)
- If DIX<0 Then MAND=0
- If DIX>0 Then MAND=1
- If DIY<0 Then MAND=2
- If DIY>0 Then MAND=3
- If DIX or DIY Then Add MANA,1,0 To 9
- Return
- ACQUAR:
- If NX<0 or NX=>MMX or NY<0 or NY=>MMY Then AR=1 : Return
- ' AR=Deek(ARST+Deek(MAPST+(NY*MMX+NX)*4)*4)
- AR=Deek(MAPST+(NY*MMX+NX)*4+2)
- Return
- GQUICK:
- Fade 1 : Wait 10
- Bob Clear : Bob Off : Bob Draw : Wait Vbl : Screen Swap
- Bob Clear : Bob Draw : Wait Vbl : Screen Swap
- If MX<0 Then Dec PAGX
- If MX=>MSX*16 Then Inc PAGX
- If MY<0 Then Dec PAGY
- If MY=>MSY*16 Then Inc PAGY
- SCROFX=0 : SCROFY=0 : SOX=0 : SOY=0
- Gosub INITMAP
- Fade 1 To 7
- Return
- GLEFT:
- Bob Clear : Bob Off : Bob Draw : Wait Vbl : Screen Swap
- Bob Clear : Bob Draw : Wait Vbl : Screen Swap
- SOX=(MSX-DX)*16
- BX=SOX/16 : BY=SOY/16
- Wait Vbl
- Screen Copy 0,SOX,SOY,SOX+WX,SOY+WY To 0,0,SOY
- OX=PAGX*MSX+BX : OY=PAGY*MSY
- For Y=BY To MSY-1
- For X=DX To 2*DX-1
- Extension_8_0A36 X,Y,Deek(MAPST+((OY+Y)*MMX+X+OX)*4)
- Next
- Next
- Wait Vbl
- Screen Offset 0,0,SOY
- Wait Vbl
- Screen Swap
- Inc PAGX
- SCROFX=0 : TX=WX+WX/10
- Repeat
- Wait Vbl
- Gosub CALCSCROLLMOVEMENTX
- Screen Offset 0,Min(SOX,WX),SOY
- Until SOX>=WX
- Wait Vbl
- Screen Offset 0,WX,SOY
- Screen Copy 0,SOX,SOY,SOX+WX,SOY+WY To 0,0,SOY
- SCROFX=0 : SOX=SCROFX
- Gosub INITMAP
- Return
- GRIGHT:
- Bob Clear : Bob Off : Bob Draw : Wait Vbl : Screen Swap
- Bob Clear : Bob Draw : Wait Vbl : Screen Swap
- SOX=0
- BX=SOX/16+MSX-DX : BY=SOY/16
- Wait Vbl
- Screen Copy 0,SOX,SOY,SOX+WX,SOY+WY To 0,WX,SOY
- Dec PAGX
- OX=PAGX*MSX+BX : OY=PAGY*MSY
- For Y=BY To MSY-1
- For X=0 To DX-1
- Extension_8_0A36 X,Y,Deek(MAPST+((OY+Y)*MMX+X+OX)*4)
- Next
- Next
- Wait Vbl
- Screen Offset 0,WX,SOY
- Wait Vbl
- Screen Swap
- SCROFX=WX*16 : TX=-WX/10
- Repeat
- Wait Vbl
- Gosub CALCSCROLLMOVEMENTX
- Screen Offset 0,Max(SOX,0),SOY
- Until SOX<=0
- Wait Vbl
- Screen Offset 0,0,SOY
- SCROFX=(MSX-DX)*256 : SOX=SCROFX/16
- Gosub INITMAP
- Return
- GDOWN:
- Bob Clear : Bob Off : Bob Draw : Wait Vbl : Screen Swap
- Bob Clear : Bob Draw : Wait Vbl : Screen Swap
- SOY=(MSY-DY)*16
- BX=SOX/16 : BY=SOY/16
- Wait Vbl
- Screen Copy 0,SOX,SOY,SOX+WX,SOY+WY To 0,SOX,0
- OX=PAGX*MSX : OY=PAGY*MSY+BY
- For Y=DY To 2*DY-1
- For X=BX To MSX-1
- Extension_8_0A36 X,Y,Deek(MAPST+((OY+Y)*MMX+X+OX)*4)
- Next
- Next
- Wait Vbl
- Screen Offset 0,SOX,0
- Wait Vbl
- Screen Swap
- Inc PAGY
- SCROFY=0 : TY=WY+WY/10
- Repeat
- Wait Vbl
- Gosub CALCSCROLLMOVEMENTY
- Screen Offset 0,SOX,Min(SOY,WY)
- Until SOY>=WY
- Wait Vbl
- Screen Offset 0,SOX,WY
- Screen Copy 0,SOX,SOY,SOX+WX,SOY+WY To 0,SOX,0
- SCROFY=0 : SOY=0
- Gosub INITMAP
- Return
- GUP:
- Bob Clear : Bob Off : Bob Draw : Wait Vbl : Screen Swap
- Bob Clear : Bob Draw : Wait Vbl : Screen Swap
- SOY=0
- BX=SOX/16 : BY=SOY/16+MSY-DY
- Wait Vbl
- Screen Copy 0,SOX,SOY,SOX+WX,SOY+WY To 0,SOX,WY
- Dec PAGY
- OX=PAGX*MSX : OY=PAGY*MSY+BY
- For Y=0 To DY-1
- For X=BX To MSX-1
- Extension_8_0A36 X,Y,Deek(MAPST+((OY+Y)*MMX+X+OX)*4)
- Next
- Next
- Wait Vbl
- Screen Offset 0,SOX,WY
- Wait Vbl
- Screen Swap
- SCROFY=WY*16 : TY=-WY/10
- Repeat
- Wait Vbl
- Gosub CALCSCROLLMOVEMENTY
- Screen Offset 0,SOX,Max(SOY,0)
- Until SOY<=0
- Wait Vbl
- Screen Offset 0,SOX,0
- SCROFY=(MSY-DY)*256 : SOY=SCROFY/16
- Gosub INITMAP
- Return
- CALCSCROLLMOVEMENT:
- NSCROFX=Min(Max(MX-WX/2,0),MSX*16-WX)*16
- NSCROFY=Min(Max(MY-WY/2,0),MSY*16-WY)*16
- Add SCRSPX,(NSCROFX-SCROFX-SCRSPX*16)/16
- Add SCRSPY,(NSCROFY-SCROFY-SCRSPY*16)/16
- Add SCROFX,SCRSPX : Add SCROFY,SCRSPY
- SOX=SCROFX/16 : SOY=SCROFY/16
- Return
- CALCSCROLLMOVEMENTX:
- Add SCRSPX,(TX*16-SCROFX-SCRSPX*16)/16
- Add SCROFX,SCRSPX
- SOX=SCROFX/16
- Return
- CALCSCROLLMOVEMENTY:
- Add SCRSPY,(TY*16-SCROFY-SCRSPY*16)/16
- Add SCROFY,SCRSPY
- SOY=SCROFY/16
- Return
- INITSCREENS:
- Screen Open 7,16,8,2,0 : Screen Hide
- Screen Open 0,640,352,32,0 : Screen Hide
- Curs Off : Flash Off : Paper 0 : Pen 1 : Cls 0
- WX=320 : WY=176+Ntsc*48
- DX=WX/16 : DY=WY/16
- Double Buffer : Autoback 0
- Bob Update Off
- For A=0 To 31 : Colour A,0 : Next
- Screen Open 1,320,56,32,0 : Screen Hide
- Curs Off : Flash Off : Paper 0 : Pen 1 : Cls 0
- Screen Display 0,128,40+Ntsc*10,WX,WY
- Screen Display 1,128,41+Ntsc*10+WY,320,56
- Extension_8_149E 0,7
- Extension_8_149E 0,1
- Screen Show 0
- Screen Show 1
- Screen 0
- Return
- INITMAP:
- Doke ANBUF,-1
- OX=PAGX*MSX : OY=PAGY*MSY
- For Y=0 To MSY-1
- For X=0 To MSX-1
- Extension_8_0A36 X,Y,Deek(MAPST+((OY+Y)*MMX+X+OX)*4)
- Next
- Next
- Wait Vbl
- Screen Offset 0,SOX,SOY
- Wait Vbl
- Screen Swap
- Wait Vbl
- Screen Copy Physic(0) To Logic(0)
- SCRSPX=0 : SCRSPY=0
- MX=MANX-PAGX*MSX*16 : MY=MANY-PAGY*MSY*16
- Return
- LOAMAP:
- LOAFIL["Maps/"+ Extension_8_0EB8(MAPN,4)+".map",9]
- ST=Start(9)
- MAPST=Start(9)+256
- MAPX=0 : MAPY=0
- MMX=Deek(ST+4)
- MMY=Deek(ST+6)
- MSX=Deek(ST+8)*TEST
- MSY=Deek(ST+10)*TEST
- MANX=32 : MANY=32
- PAGX=MANX/(MSX*16) : PAGY=MANY/(MSY*16)
- AD=MAPST
- For A=1 To MMX*MMY
- P=Deek(AD+2)
- If P and $8000
- Doke AD+2,P and $7FFF
- Else
- Doke AD+2,Deek(ARST+Deek(AD)*4) and $7F8F
- End If
- Add AD,4
- Next
- Return
- Procedure RIPGFX
- Load Iff "Men&Weapons.iff",0
- For A=0 To 31
- Extension_8_14C6 1,A,Colour(A)
- Next
- Extension_8_149E 0,0 : View
- For Y=0 To Screen Height-1
- For X=0 To Screen Width-1
- Extension_8_0388 X,Y, Extension_8_1504( Extension_8_14B6(1, Extension_8_039E(X,Y)))
- Next
- Next
- For A=0 To 4
- Get Bob A+2,A*17+1,5*17+1 To A*17+17,5*17+17
- Next
- For A=6 To 10
- Get Bob A+1,A*17+1,5*17+1 To A*17+17,5*17+17
- Next
- For A=0 To 4
- Get Bob A+12,A*17+1,6*17+1 To A*17+17,6*17+17
- Next
- For A=6 To 10
- Get Bob A+11,A*17+1,6*17+1 To A*17+17,6*17+17
- Next
- For A=2 To 21
- Hot Spot A,$11
- Next
- Screen Close 0
- End Proc
- Procedure LOAFIL[FIL$,BNK]
- If Exist(FIL$)=0 Then Dir$="LOM:"
- Extension_8_0456 FIL$,BNK
- End Proc